//
//  ISSMacros.h
//
//  Created by Wonder Chang on 13/4/6.
//  Copyright (c) 2013年 ZL. All rights reserved.
//

#import "AppConstants.h"
#import "LanguageRes.h"
#import "ColorDefinition.h"

#ifndef ISSMacros_h
#define ISSMacros_h

#pragma mark - 设备大小获取宏定义

/**
 * 导航栏高度
 */
#define NavigationBar_HEIGHT 44

/**
 * 屏幕宽度
 */
#define SCREEN_WIDTH ([UIScreen mainScreen].bounds.size.width)

/**
 * 屏幕高度
 */
#define SCREEN_HEIGHT ([UIScreen mainScreen].bounds.size.height)

#pragma mark - 应用版本获取宏定义

/**
 * 当前应用版本
 */
#define CurrentAppVersion [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"];

#pragma mark - 图片加载宏定义

/**
 * 读取本地图片
 * @param file 图片文件名
 * @param ext 图片文件扩展类型
 */
#define LOADIMAGE(file,ext) [UIImage imageWithContentsOfFile:[[NSBundle mainBundle]pathForResource:file ofType:ext]]

/**
 * 定义UIImage对象
 * @param A 图片文件名
 */
#define IMAGE(A) [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:A ofType:nil]]

/**
 * 定义UIImage对象，使用系统缓存
 * @param name 图片文件名
 */
#define ImageNamed(name) [UIImage imageNamed:name]

#pragma mark - 刘海屏适配宏定义

/**
 * 判断是否为iPhone X系列
 */
#define IS_iPhoneX \
({BOOL isPhoneX = NO;\
if (@available(iOS 11.0, *)) {\
isPhoneX = [[UIApplication sharedApplication] delegate].window.safeAreaInsets.bottom > 0.0;\
}\
(isPhoneX);})

/**
 * 状态栏高度
 */
#define kStatusBarHeight    (CGFloat)(IS_iPhoneX?(44):(20))

/**
 * iPhoneX的状态栏高度差值
 */
#define kTopBarDifHeight    (CGFloat)(IS_iPhoneX?(24):(0))

/**
 * 顶部安全区域远离高度
 */
#define kTopBarSafeHeight   (CGFloat)(IS_iPhoneX?(44):(0))

/**
 * 状态栏和导航栏总高度
 */
#define kNavBarHAbove      (CGFloat)(IS_iPhoneX?(88):(64))

/**
 * TabBar高度
 */
#define kTabBarHeight       (CGFloat)(IS_iPhoneX?(49+34):(49))

/**
 * 底部安全区域远离高度
 */
#define kBottomSafeHeight   (CGFloat)(IS_iPhoneX?(34):(0))

#pragma mark - 系统信息宏定义

/**
 * 获取系统版本
 */
#define IOS_VERSION [[[UIDevice currentDevice] systemVersion] floatValue]
#define CurrentSystemVersion [[UIDevice currentDevice] systemVersion]

/**
 * 获取当前语言
 */
#define CurrentLanguage ([[NSLocale preferredLanguages] objectAtIndex:0])

/**
 * 判断是否为iPad
 */
#define isPad (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)

#pragma mark - 屏幕尺寸宏定义

/**
 * 判断是否为4.0英寸iPhone
 */
#define iPhone_40inch ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(640, 1136), [[UIScreen mainScreen] currentMode].size) : NO)

/**
 * 判断是否为4.7英寸iPhone
 */
#define iPhone_47inch ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(750, 1334), [[UIScreen mainScreen] currentMode].size) : NO)

/**
 * 判断是否为3.5英寸iPhone
 */
#define iPhone_35inch ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(640, 960), [[UIScreen mainScreen] currentMode].size) : NO)

/**
 * 判断是否为5.5英寸iPhone
 */
#define iPhone_55inch ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1242, 2208), [[UIScreen mainScreen] currentMode].size) : NO)

#pragma mark - 设备类型宏定义

/**
 * 判断是否为真机
 */
#if TARGET_OS_IPHONE
//iPhone Device
#endif

/**
 * 判断是否为模拟器
 */
#if TARGET_IPHONE_SIMULATOR
//iPhone Simulator
#endif

#pragma mark - 系统版本判断宏定义

/**
 * 检查系统版本是否等于v
 */
#define SYSTEM_VERSION_EQUAL_TO(v)                  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame)

/**
 * 检查系统版本是否大于v
 */
#define SYSTEM_VERSION_GREATER_THAN(v)              ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)

/**
 * 检查系统版本是否大于等于v
 */
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)

/**
 * 检查系统版本是否小于v
 */
#define SYSTEM_VERSION_LESS_THAN(v)                 ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)

/**
 * 检查系统版本是否小于等于v
 */
#define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v)     ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending)

#pragma mark - IOS版本判断宏定义

/**
 * 判断是否大于或等于IOS7
 */
#define IS_IOS7 SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")

/**
 * 判断是否大于或等于IOS8
 */
#define IS_IOS8 SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")

#pragma mark - 视图宏定义

/**
 * 设置View的tag属性
 */
#define VIEWWITHTAG(_OBJECT, _TAG)    [_OBJECT viewWithTag : _TAG]

/**
 * 程序的本地化,引用国际化的文件
 */
#define MyLocal(x, ...) NSLocalizedString(x, nil)

#pragma mark - GCD宏定义

/**
 * GCD后台执行
 */
#define BACK(block) dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), block)

/**
 * GCD主线程执行
 */
#define MAIN(block) dispatch_async(dispatch_get_main_queue(),block)

#pragma mark - NSUserDefaults宏定义

/**
 * NSUserDefaults 实例化
 */
#define USER_DEFAULT [NSUserDefaults standardUserDefaults]

#pragma mark - 角度弧度转换宏定义

/**
 * 由角度获取弧度
 */
#define degreesToRadian(x) (M_PI * (x) / 180.0)

/**
 * 由弧度获取角度
 */
#define radianToDegrees(radian) (radian*180.0)/(M_PI)

#pragma mark - 单例化宏定义

/**
 * 单例化一个类
 */
#define SYNTHESIZE_SINGLETON_FOR_CLASS(classname) \
\
static classname *shared##classname = nil; \
\
+ (classname *)shared##classname \
{ \
@synchronized(self) \
{ \
if (shared##classname == nil) \
{ \
shared##classname = [[self alloc] init]; \
} \
} \
\
return shared##classname; \
} \
\
+ (id)allocWithZone:(NSZone *)zone \
{ \
@synchronized(self) \
{ \
if (shared##classname == nil) \
{ \
shared##classname = [super allocWithZone:zone]; \
return shared##classname; \
} \
} \
\
return nil; \
} \
\
- (id)copyWithZone:(NSZone *)zone \
{ \
return self; \
}

#endif /* ISSMacros_h */
